/**
 * 定义一个懒加载函数, 传入一个supplier, 调用lazy返回的函数即返回supplier的返回结果, 并且缓存其结果, 下次调用继续返回缓存内容
 * @param supplier 数据提供者
 */
export function lazy<R>(supplier: () => R): () => R {
    let obtained = false;
    let value: R | undefined;
    return function () {
        if (!obtained) {
            value = supplier();
            obtained = true;
        }
        return value as R;
    }
}